package com.ktjy.goods.feign;

import com.ktjy.base.Q;
import com.ktjy.base.R;
import com.ktjy.goods.feign.fallback.FeignProductServiceFallback;
import com.ktjy.pojo.goods.Product;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 商品接口
 *
 * @author LILIBO
 * @since 2025-02-18
 */
@FeignClient(value = "cloud-service-goods", fallback = FeignProductServiceFallback.class)
// @RequestMapping("/product")
public interface FeignProductService {

    /**
     * 新增商品记录
     *
     * @param product 商品
     * @return R 成功返回true
     */
    @Operation(summary = "新增商品记录")
    @PostMapping("/goods/product/add")
    R add(@Parameter(description = "商品对象") @RequestBody Product product);

    /**
     * 保存或更新商品记录
     *
     * @param product 商品（带主键ID表示更新，否则为新增）
     * @return R 成功返回保存后的完整对象
     */
    @Operation(summary = "保存或更新商品记录")
    @PostMapping("/goods/product/save")
    R save(@Parameter(description = "商品对象") @RequestBody Product product);

    /**
     * 修改商品记录
     *
     * @param product 商品
     * @return R 成功返回true
     */
    @Operation(summary = "修改商品记录")
    @PostMapping("/goods/product/update")
    R update(@Parameter(description = "商品对象") @RequestBody Product product);

    /**
     * 通过id删除一条商品记录
     *
     * @param id
     * @return R 成功返回true
     */
    @Operation(summary = "通过id删除一条商品记录")
    @PostMapping("/goods/product/delete")
    R deleteById(@Parameter(description = "商品id") Long id);

    /**
     * 通过多个id批量删除商品记录
     *
     * @param ids
     * @return R
     */
    @Operation(summary = "通过多个id批量删除商品记录")
    @PostMapping("/goods/product/remove")
    R removeByIds(@Parameter(description = "商品id集合") @RequestBody List<Long> ids);

    /**
     * 通过id查询单条商品记录
     *
     * @param id
     * @return R
     */
    @Operation(summary = "通过id查询单条商品记录")
    @GetMapping("/goods/product/{id}")
    R getById(@Parameter(description = "商品id") @PathVariable Long id);

    /**
     * 查询商品列表
     *
     * @param product 商品
     * @return R
     */
    @Operation(summary = "查询商品列表")
    @GetMapping("/goods/product/list")
    R list(@Parameter(description = "查询的商品对象") Product product);

    /**
     * 分页查询商品
     *
     * @param pageNo 当前页
     * @param pageSize 每页条数
     * @param product 商品
     * @return
     */
    @Operation(summary = "分页查询商品")
    @GetMapping("/goods/product/page")
    R page(@Parameter(description = "当前页") @RequestParam(required = false, defaultValue = "1") Long pageNo, @Parameter(description = "每页条数") @RequestParam(required = false, defaultValue = "10") Long pageSize, @Parameter(description = "查询的商品对象") Product product);

    /**
     * 分页查询商品列表
     *
     * @param pageNo 当前页
     * @param pageSize 每页条数
     * @param param 通用查询参数
     * @return 返回分页数据列表，其中count为数据总量
     */
    @Operation(summary = "分页查询商品列表")
    @GetMapping("/goods/product/querypage")
    R queryPage(@Parameter(description = "当前页") @RequestParam(required = false, defaultValue = "1") Long pageNo, @Parameter(description = "每页条数") @RequestParam(required = false, defaultValue = "10") Long pageSize, @Parameter(description = "通用查询参数") Q param);

}
